package com.ato.CommonClass.DateClass;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

/**
 * @author wangjing
 * @create 2021--10--08--22:07
 * <p>
 * java.util.Date;  父
 * java.sql.Date  子
 */
public class DateTest {
    public static void main(String[] args) {
        long l = System.currentTimeMillis();
        System.out.println("long System.currentTimeMillis() :1970年1月1日0时0分 到现在的 以毫秒为单位的时间差(时间戳) : " + l);

        Date date = new Date();//  空参构造器获取到的是当前时间
        System.out.println(date.toString()); //  Fri Oct 08 22:13:27 CST 2021
        System.out.println(date.getTime()); // 1633702460419  和System.currentTimeMillis()一致。获取时间戳

        Date date1 = new Date(1633702460419L); // long 型 ：注意
        System.out.println(date1);

//        --   sql.Date
        java.sql.Date date2 = new java.sql.Date(1633702460419L); // 2021-10-08
        System.out.println(date2);
//      如何将util.Date  转换成 sql.Date
        java.sql.Date date3 = new java.sql.Date(new Date().getTime()); // 2021-10-08

        /*
         SimpleDateFormat： 格式化日期 ：日期 ----> 字符串和
                            转化   字符串  --->  日期
         */
        SimpleDateFormat spfpormat = new SimpleDateFormat();
        /**
         * 参数：可选：String  yyyy.MMMMM.dd GGG hh:mm
         *                      yyyy-MM-dd  hh:mm:ss
         */
        Date date4 = new Date();
        String format = spfpormat.format(date4);
        System.out.println("formant: " + format);  //   21-10-31 下午12:09
        try {
            // 解析：需要抛异常
            Date parse = spfpormat.parse(format);
            System.out.println("parse: " + parse);  //  Sun Oct 31 12:22:00 CST 2021
        } catch (ParseException e) {
            e.printStackTrace();
        }

        SimpleDateFormat s2 = new SimpleDateFormat("yyyy-MM-dd  hh:mm:ss");
        System.out.println("带有参数的格式化：" + s2.format(date4));
        try {

            System.out.println("解析也需要相同格式" + s2.parse(s2.format(date4)));
        } catch (Exception e) {
            e.printStackTrace();
        }
        // Calender  抽象基类
//                  1: 使用构造方法
//           注意：月份从0开始
        Calendar calendar = Calendar.getInstance();
        int i = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println("当前月份的第: " + i + "天");
        /**
         * set是void的，会修改Calender
         */
//        设置今天是当月的第几天
        calendar.set(Calendar.DAY_OF_MONTH, 23);
        // 今天是当月的第几天并且要加上后面的 amount参数
        calendar.add(Calendar.DAY_OF_MONTH, 23);

        Date time = calendar.getTime();
        System.out.println("把日历获取成Date  " + time);
        calendar.setTime(time);


//                  2：使用子类实例化
//        GregorianCalendar gregorianCalendar = new GregorianCalendar();
        System.out.println("********************java日期存在问题***************");
        /**
         * 比如new Date(2021,9,8)
         *  输入后则不是想要的值，因为 java的日期是从1900开始，并且月份从0开始
         *   Celender不支持格式化
         *   不是线程安全的
         */
        Date date5 = new Date(2021, 10, 31);
//        Date date5 = new Date(2021-1900, 10-1, 31); // 正确的
        System.out.println(date5); // Thu Dec 01 00:00:00 CST 3921
        //  因此  JDK8以后 引入了第三方jar包：Joda-time 作为jdk8自带的日期
        /**
         * java.time
         * java.time.format
         * 包含： LocalDate ：本地日期  LocalTime  本地时间  LocalDateTime 本地日期时间  ZoneDateTime ： 时区 Duration:持续时间
         */
        LocalDate localDate = LocalDate.now();
        LocalTime localTime = LocalTime.now();
        LocalDateTime now = LocalDateTime.now();
        System.out.println("LocalDate  " + localDate);
        System.out.println("localTime  " + localTime);
        System.out.println("LocalDateTime  " + now);
        LocalDateTime of = LocalDateTime.of(2021, 10, 31, 19, 52);
        System.out.println("使用of 创建指定时间" + of);
        int dayOfMonth = now.getDayOfMonth();
        System.out.println("getXxx 获取：比如获取当前时间属于该月的第几天：" + dayOfMonth);
        LocalDateTime localDateTime = now.withDayOfMonth(1);
        System.out.println("withXxxx ： 设置 ,比如 withDayOfMonth ： " + localDateTime);

        LocalDateTime localDateTime1 = now.plusMonths(2L);
        System.out.println("plusXXXX 增加 比如plusMonths(Long long)  : " + localDateTime1);
        LocalDateTime localDateTime2 = now.minusMonths(1L);
        System.out.println("minusXXXX 减少 比如：minusMonths(Long long)  : " + localDateTime2);
        //  从1970年开始的毫秒数
        Instant instant = Instant.now();
        System.out.println("instant.now() :注意时区问题 " + instant);
        OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));//  2021-10-31T12:11:44.872Z
        System.out.println("instant.atOffset(ZoneOffset.ofHours(8)) 我们的时区的时间 " + offsetDateTime); //  2021-10-31T20:11:44.872+08:00
        long l1 = instant.toEpochMilli();
        System.out.println("获取当前时间到1970年的毫秒数，注意是加了时区的: " + l1);
        Instant instant1 = Instant.ofEpochMilli(1635682413467L);
        System.out.println("通过Instan这个类的ofEpochMilli(Long l1)方法：通过毫秒数获取日期" + instant1);


//    格式化或者解析
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
        String format1 = formatter.format(LocalDateTime.now());
        System.out.println("格式化format ，解析就是parse： "+ format1);


    }

}
